﻿Public Class VigiaDeDiretorio

    Private _diretorios As String()
    Public Overridable Property Diretorios() As String()
        Get
            Return _diretorios
        End Get
        Set(ByVal value As String())
            _diretorios = value
        End Set
    End Property

    Private _diretoriosDestino As IDictionary(Of String, String)
    Public ReadOnly Property DiretoriosDestino() As IDictionary(Of String, String)
        Get
            Return _diretoriosDestino
        End Get
    End Property


    Private _diretorioBase As String
    Public Property DiretorioBase() As String
        Get
            Return _diretorioBase
        End Get
        Set(ByVal value As String)
            _diretorioBase = value
            Me.VerificaSeVBPROJExiste()
        End Set
    End Property

    Private _arquivoASerCortado As String
    Public Overridable Property ArquivoASerCortado() As String
        Get
            Return _arquivoASerCortado
        End Get
        Set(ByVal value As String)
            _arquivoASerCortado = value
        End Set
    End Property

    Public Function DiretoriosSaoValidos() As Boolean

        For Each _dir In _diretoriosDestino.Values

            'If Not _dir.EndsWith("\") AndAlso Not _dir.EndsWith("/") Then
            '    If Not IO.File.Exists(_dir) Then Console.WriteLine("Nao existe arquivo: " & _dir) : Return False
            'End If

            If _dir.EndsWith("\") Or _dir.EndsWith("/") Then
                'If Not IO.Directory.Exists(_dir) Then Console.WriteLine("Nao existe diretório: " & _dir) : Return False
                If Not IO.Directory.Exists(_dir) Then IO.Directory.CreateDirectory(_dir)
            End If

        Next

        Return True
    End Function

    Public Function ArquivosSaoValidos() As Boolean

        For Each _dir In _diretoriosDestino.Values
            If Not _dir.EndsWith("\") AndAlso Not _dir.EndsWith("/") Then
                If Not IO.File.Exists(_dir) Then IO.Directory.CreateDirectory(_dir) : IO.Directory.Delete(_dir) : IO.File.Create(_dir)
            End If
        Next

        Return True

    End Function

    Public Sub New(ByVal _diretorioBase As String, ByVal _arquivoASerCortado As String)
        Me.ArquivoASerCortado = _arquivoASerCortado
        Me.DiretorioBase = _diretorioBase
        _diretoriosDestino = New Dictionary(Of String, String)

        _diretoriosDestino.Add("BaseDominio", Me.DiretorioBase & "\Dominio\BaseDominio.vb")
        _diretoriosDestino.Add("IRepositorio", Me.DiretorioBase & "\Repositorios\Interface\IRepositorio.vb")
        _diretoriosDestino.Add("Repositorio", Me.DiretorioBase & "\Repositorios\Implementacao\Repositorio.vb")
        _diretoriosDestino.Add("InterfaceDao", Me.DiretorioBase & "\Repositorios\Interface\")
        _diretoriosDestino.Add("Dao", Me.DiretorioBase & "\Repositorios\Implementacao\")
        _diretoriosDestino.Add("hbm", Me.DiretorioBase & "\Repositorios\Mapeamento\")
        _diretoriosDestino.Add("Spring", Me.DiretorioBase & "\Spring\Dal.xml")

        '_diretoriosDestino.Add("BaseDominio", "C:\Projetos\Rascunho\RascunhoLeilao\Storage\BaseDominioFake.vb")
        '_diretoriosDestino.Add("IRepositorio", "C:\Projetos\Rascunho\RascunhoLeilao\Storage\IRepositorioFake.vb")
        '_diretoriosDestino.Add("Repositorio", "C:\Projetos\Rascunho\RascunhoLeilao\Storage\RepositorioFake.vb")
        '_diretoriosDestino.Add("Spring", "C:\Projetos\Rascunho\RascunhoLeilao\Storage\DalFake.xml")
        '_diretoriosDestino.Add("InterfaceDao", "C:\Projetos\Rascunho\RascunhoLeilao\Storage\")
        '_diretoriosDestino.Add("Dao", "C:\Projetos\Rascunho\RascunhoLeilao\Storage\")
        '_diretoriosDestino.Add("hbm", "C:\Projetos\Rascunho\RascunhoLeilao\Storage\")


        'Throw New NotImplementedException("implementar rotina que vigia")
    End Sub

    Public Sub GerarArquivos()

        'Dim _conteudo As String
        'Dim _conteudo As String
        'Dim _arquivo As String = "C:\Projetos\Rascunho\RascunhoLeilao\DominioRico\Dominio\OutraOpcao.vb"
        'Dim _arquivo As String = Me.DiretorioBase & "OutraOpcao.vb"
        Dim _arquivo As String = Me.DiretorioBase & Me.ArquivoASerCortado
        Dim _arquivoExiste As Boolean = False
        Dim _diretorioExiste As Boolean = False
        Dim _conteudoArray() As String
        Dim _arquivos As IList(Of Destino)
        _arquivos = New List(Of Destino)

        _arquivoExiste = IO.File.Exists(_arquivo)
        _diretorioExiste = IO.Directory.Exists(Me.DiretorioBase)

        Console.WriteLine("Diretério existe: {0}", _diretorioExiste)
        Console.WriteLine("Arquivo: {0}", _arquivo)
        Console.WriteLine("Existe: {0}", _arquivoExiste)

        '_conteudo = Me.GetConteudoASerDisperso()
        '_conteudo = GetConteudoASerDisperso("C:\Projetos\Rascunho\RascunhoLeilao\DominioRico\Dominio\Testando.vb")
        If Me.DiretoriosSaoValidos() AndAlso Me.ArquivosSaoValidos AndAlso _diretorioExiste AndAlso _arquivoExiste Then
            _conteudoArray = GetArrayConteudoASerDisperso(_arquivo)

            'Console.WriteLine("Tamanho (linhas): {0}", _conteudoArray.Length)

            'For Each _linha In _conteudoArray
            '    Console.WriteLine("{0}", _linha)
            'Next

            _arquivos.Add(New Destino("'--BASEDOMINIO:", _diretoriosDestino("BaseDominio"), TipoDestino.BaseDominio))
            _arquivos.Add(New Destino("'--IREPOSITORIO:", _diretoriosDestino("IRepositorio"), TipoDestino.IRepositorio))
            _arquivos.Add(New Destino("'--REPOSITORIO:", _diretoriosDestino("Repositorio"), TipoDestino.Repositorio))
            _arquivos.Add(New Destino("'--SPRING:", _diretoriosDestino("Spring"), TipoDestino.Spring))
            _arquivos.Add(New Destino("'--INTERFACE DAO:", _diretoriosDestino("InterfaceDao")))
            _arquivos.Add(New Destino("'--IMPLEMENTACAO DAO:", _diretoriosDestino("Dao")))
            _arquivos.Add(New Destino("'--HBM:", _diretoriosDestino("hbm")))

            Me.SeparationsOfConcerns(_conteudoArray, _arquivos)
        End If

    End Sub

    Protected Function LinhaEhOutroMarcador(ByVal _destinos As List(Of Destino), ByVal _marcadorSecao As String, ByVal _linhaEmAnalise As String) As Boolean

        Dim q = From c In _destinos Where Not _linhaEmAnalise.Contains(_marcadorSecao) And Me.LinhaEhMarcador(_linhaEmAnalise)

        If q.Count > 0 Then
            Return True
        End If

        Return False

    End Function


    Protected Sub SeparationsOfConcerns(ByVal _conteudo() As String, ByVal _destinos As List(Of Destino))

        Dim _conteudoASerDespachado As String = String.Empty
        Dim _marcadorDeSecaoAtual As String
        Dim _linhaAtual As String
        Dim _modoCaptura As Boolean = False
        Dim _linhasASeremTransferidas As String()

        _linhasASeremTransferidas = _conteudo

        For Each _destino In _destinos
            _marcadorDeSecaoAtual = _destino.Marcador
            For i = 0 To (_linhasASeremTransferidas.Count - 1)
                _linhaAtual = _linhasASeremTransferidas(i)
                If _linhaAtual.Contains(_marcadorDeSecaoAtual) Or _modoCaptura Then
                    _modoCaptura = True
                    If Me.LinhaEhOutroMarcador(_destinos, _marcadorDeSecaoAtual, _linhaAtual) Then
                        Exit For
                    End If

                    If _linhaAtual.Trim = "" Then
                        Console.WriteLine("")
                    End If


                    If Not Me.LinhaEhMarcador(_linhaAtual) Then
                        _conteudoASerDespachado &= _linhaAtual & vbCrLf
                    End If

                End If

            Next
            _modoCaptura = False
            Me.DespacharDados(_destino, _conteudoASerDespachado)
            _conteudoASerDespachado = String.Empty
        Next


    End Sub

    'Protected Sub SeparationsOfConcerns(ByVal _conteudo As String, ByVal _destinos As List(Of Destino))

    '    Dim _conteudoASerDespachado As String = String.Empty
    '    Dim _marcadorDeSecaoAtual As String
    '    Dim _linhaAtual As String
    '    Dim _modoCaptura As Boolean = False
    '    Dim _linhasASeremTransferidas As String()

    '    _linhasASeremTransferidas = _conteudo.Split(vbCrLf)

    '    For Each _destino In _destinos
    '        _marcadorDeSecaoAtual = _destino.Marcador
    '        For i = 0 To (_linhasASeremTransferidas.Count - 1)
    '            _linhaAtual = _linhasASeremTransferidas(i)
    '            If _linhaAtual.Contains(_marcadorDeSecaoAtual) Or _modoCaptura Then
    '                _modoCaptura = True
    '                If Me.LinhaEhOutroMarcador(_destinos, _marcadorDeSecaoAtual, _linhaAtual) Then
    '                    Exit For
    '                End If

    '                If _linhaAtual.Trim = "" Then
    '                    Console.WriteLine("")
    '                End If


    '                If Not Me.LinhaEhMarcador(_linhaAtual) Then
    '                    _conteudoASerDespachado &= vbCrLf & _linhaAtual
    '                End If

    '            End If

    '        Next
    '        _modoCaptura = False
    '        Me.DespacharDados(_destino, _conteudoASerDespachado)
    '        _conteudoASerDespachado = String.Empty
    '    Next

    'End Sub

    Protected Function LinhaEhMarcador(ByVal _linha As String) As Boolean

        If _linha.Contains("'--") AndAlso _linha.Contains(":") Then
            Return True
        End If

        Return False

    End Function

    Protected Sub VerificaSeVBPROJExiste()
        Dim _teste As String
        _teste = Me.GetNomeDoVBPROJ()
    End Sub

    Protected Function GetNomeDoVBPROJ() As String

        Dim _arquivoVBPROJ As String = String.Empty
        Dim _arquivos() As String
        _arquivos = IO.Directory.GetFiles(Me.DiretorioBase)

        Dim q = From c In _arquivos Where c.EndsWith(".vbproj") Select c

        If q.Count = 1 Then
            _arquivoVBPROJ = q.First
        ElseIf q.Count = 0 Then
            Throw New Exception("O diretório informado não pode ser base pois não possui arquivo vbproj. " & Me.DiretorioBase)
        ElseIf q.Count > 1 Then
            Throw New Exception("Existem mais de um arquivo vbproj no diretório base : " & Me.DiretorioBase)
        End If

        Return _arquivoVBPROJ

    End Function

    Protected Sub RegistraNoVBPROJ(ByVal _pathCompletoArquivo As String)
        Dim _pathArray() As String
        Dim _nome As String
        Dim _diretorio As String
        Dim _nomeDoVbProj As String

        _nomeDoVbProj = Me.GetNomeDoVBPROJ()
        _pathCompletoArquivo = Replace(_pathCompletoArquivo, "\\", "\")
        _pathCompletoArquivo = Replace(_pathCompletoArquivo, "\\\", "\")
        _pathArray = Split(_pathCompletoArquivo, "\")


        _nome = _pathArray(_pathArray.Length - 1)
        _diretorio = _pathArray(_pathArray.Length - 2)


        Select Case _diretorio
            Case "Implementacao"
                Me.InjetaNoPontoExato(_nomeDoVbProj, "<Compile Include=""Repositorios\Implementacao\" & _nome & """ />", TipoContagem.FimParaInicio, "</Project>", "</ItemGroup>", "<ItemGroup>", "</ItemGroup>", "<ItemGroup>", "</ItemGroup>", "<ItemGroup>", "</ItemGroup>")
            Case "Interface"
                Me.InjetaNoPontoExato(_nomeDoVbProj, "<Compile Include=""Repositorios\Interface\" & _nome & """ />", TipoContagem.FimParaInicio, "</Project>", "</ItemGroup>", "<ItemGroup>", "</ItemGroup>", "<ItemGroup>", "</ItemGroup>", "<ItemGroup>", "</ItemGroup>")
            Case "Mapeamento"
                Me.InjetaNoPontoExato(_nomeDoVbProj, "<EmbeddedResource Include=""Repositorios\Mapeamento\" & _nome & """ />", TipoContagem.FimParaInicio, "</Project>", "</PropertyGroup>", "</ItemGroup>")
        End Select

        '"</Project>", "</ItemGroup>","<ItemGroup>","</ItemGroup>","<ItemGroup>","</ItemGroup>","<ItemGroup>","</ItemGroup>"

        '

        'Me.InjetaNoPontoExato(Me.DiretorioBase & "ExtracaoFAKE.vbproj", "<Compile Include=""Repositorios\Implementacao\LogExtracaoDao.vb"" />", TipoContagem.FimParaInicio, "</Project>", "</PropertyGroup>", "</ItemGroup>")
        'Me.InjetaNoPontoExato(Me.DiretorioBase & "ExtracaoFAKE.vbproj", "<Compile Include=""Dominio\ConexaoExtracao.vb"" />", TipoContagem.FimParaInicio, "</Project>", "</PropertyGroup>", "</ItemGroup>")

        Console.WriteLine("RegistraNoVbProj: " & _pathCompletoArquivo)
    End Sub

    Protected Sub DespacharDados(ByVal _destino As Destino, ByVal _conteudo As String)
        'SE FOR NOME COMPLETO DE ARQUIVO VERRIFICA SE EXISTE
        'SE EXISTIR ESTOURA EXCECAO
        'SE NAO EXISTIR CRIAR O ARQUIVO 
        'SALVAR CONTEUDO
        Dim _streamWriter As System.IO.StreamWriter
        Dim _pathEArquivo As String
        Dim _nomeArquivo As String

        If _destino.DiretorioDestino.EndsWith("\") Or _destino.DiretorioDestino.EndsWith("/") Then
            '_pathEArquivo = _destino.DiretorioDestino & _nomeArquivo & Now.Year & Now.Month & Now.Day & Now.Hour & Now.Minute & Now.Second & ".vb"
            _nomeArquivo = Me.ExtraiNomeArquivo(_conteudo)
            _pathEArquivo = _destino.DiretorioDestino & _nomeArquivo
            Me.RegistraNoVBPROJ(_pathEArquivo)
            Try
                _streamWriter = IO.File.CreateText(_pathEArquivo)
                Try
                    _streamWriter.WriteLine(_conteudo)
                    _streamWriter.Flush()
                Finally
                    _streamWriter.Close()
                End Try
            Catch ex As IO.IOException
                Console.WriteLine(ex.Message)
            End Try


        End If

        If Not _destino.DiretorioDestino.EndsWith("\") AndAlso Not _destino.DiretorioDestino.EndsWith("/") Then
            _pathEArquivo = _destino.DiretorioDestino

            If Not IO.File.Exists(_pathEArquivo) Then
                Throw New Exception("Arquivo " & _pathEArquivo & " não existe.")
            End If

            Me.InjetaCodigo(_conteudo, _destino)
            '_pathEArquivo = _destino.DiretorioDestino
            '    If Not IO.File.Exists(_pathEArquivo) Then
            '        _streamWriter = IO.File.CreateText(_pathEArquivo)
            '        Try
            '            _streamWriter.WriteLine(_conteudo)
            '            _streamWriter.Flush()
            '        Catch ex As Exception
            '            _streamWriter.Close()
            '        End Try
            '    End If
        End If


        'SE O NOME NAO FOR COMPLETO
        'VERIFICA O NOME DO ARQUIVO {Interface, Class + .vb}
        'PASSA O CONTEÚDO PARA ARQUIVO NOVO
    End Sub

    Protected Function GetArrayConteudoASerDisperso(ByVal _arquivoBase As String) As String()

        Dim _arquivoFullPath As String = _arquivoBase
        Dim _conteudo() As String

        If Not IO.File.Exists(_arquivoFullPath) Then
            Throw New Exception("")
        End If

        _conteudo = System.IO.File.ReadAllLines(_arquivoFullPath)

        Return _conteudo

    End Function

    Protected Function GetConteudoASerDisperso(ByVal _arquivoBase As String) As String

        Dim _arquivoFullPath As String = _arquivoBase
        Dim _conteudo As String

        If Not IO.File.Exists(_arquivoFullPath) Then
            Throw New Exception("")
        End If

        _conteudo = System.IO.File.ReadAllText(_arquivoFullPath)

        Return _conteudo

        'Return "'Digite o NameSpace: Fgv.NameSpaceQualquer" & vbCrLf & "<Serializable()> _" & vbCrLf & "Public Class ClasseQualquer" & vbCrLf & "Inherits BaseDominio" & vbCrLf & "" & vbCrLf & "#Region ""Negocio""" & vbCrLf & "" & vbCrLf & "Public Sub New()" & vbCrLf & "    MyBase.New()" & vbCrLf & "End Sub" & vbCrLf & "" & vbCrLf & "" & vbCrLf & "Public Overridable Function Buscar(ByVal _id As Long) As ClasseQualquer" & vbCrLf & "    Return MyBase.ClasseQualquerDao.Buscar(_id)" & vbCrLf & "End Function" & vbCrLf & "" & vbCrLf & "Public Overridable Sub Salvar()" & vbCrLf & "    MyBase.ClasseQualquerDao.Salvar(Me)" & vbCrLf & "" & vbCrLf & "End Sub" & vbCrLf & "" & vbCrLf & "#End Region" & vbCrLf & "" & vbCrLf & "End Class" & vbCrLf & "'--BASEDOMINIO:" & vbCrLf & "" & vbCrLf & "Protected Overridable Property ClasseQualquerDao() As IClasseQualquerDao Implements IRepositorio.ClasseQualquerDao" & vbCrLf & "    Get" & vbCrLf & "        Return Me.Repositorio.ClasseQualquerDao" & vbCrLf & "    End Get" & vbCrLf & "    Set(ByVal value As IClasseQualquerDao)" & vbCrLf & "" & vbCrLf & "    End Set" & vbCrLf & "End Property" & vbCrLf & "'--IREPOSITORIO:" & vbCrLf & "Property ClasseQualquerDao() As IClasseQualquerDao" & vbCrLf & "" & vbCrLf & "'--REPOSITORIO:" & vbCrLf & "" & vbCrLf & "Private _ClasseQualquerDao As IClasseQualquerDao" & vbCrLf & "Public Property ClasseQualquerDao() As IClasseQualquerDao Implements IRepositorio.ClasseQualquerDao" & vbCrLf & "" & vbCrLf & "    Get" & vbCrLf & "        Return _ClasseQualquerDao" & vbCrLf & "    End Get" & vbCrLf & "    Set(ByVal value As IClasseQualquerDao)" & vbCrLf & "        _ClasseQualquerDao = value" & vbCrLf & "    End Set" & vbCrLf & "End Property" & vbCrLf & "'--INTERFACE DAO:" & vbCrLf & "Imports Fgv.Framework.Dal" & vbCrLf & "" & vbCrLf & "Public Interface IClasseQualquerDao" & vbCrLf & "Inherits IGenericDao(Of ClasseQualquer)" & vbCrLf & "" & vbCrLf & "End Interface" & vbCrLf & "" & vbCrLf & "'--IMPLEMENTACAO DAO:" & vbCrLf & "" & vbCrLf & "Imports Fgv.Framework.Dal.NHibernate" & vbCrLf & "Imports NHibernate.Criterion" & vbCrLf & "Imports NHibernate" & vbCrLf & "Imports Fgv.Framework.Dal" & vbCrLf & "" & vbCrLf & "Public Class ClasseQualquerDao" & vbCrLf & "Inherits GenericsNHibernateDao(Of ClasseQualquer)" & vbCrLf & "Implements IClasseQualquerDao" & vbCrLf & "" & vbCrLf & "End Class" & vbCrLf & "" & vbCrLf & "'--HBM:" & vbCrLf & "" & vbCrLf & "<hibernate-mapping xmlns=""urn:nhibernate-mapping-2.2"" schema=""dbo"" namespace=""Fgv.NameSpaceQualquer"" assembly=""Fgv.NameSpaceQualquer"">" & vbCrLf & "" & vbCrLf & "  <class name=""ClasseQualquer"" table=""ClasseQualquer"" lazy=""true"">" & vbCrLf & "    <id name=""Id"" column=""IdClasseQualquer"" unsaved-value=""null"">" & vbCrLf & "      <generator class=""identity"" />" & vbCrLf & "    </id>" & vbCrLf & "" & vbCrLf & "  </class>" & vbCrLf & "" & vbCrLf & "</hibernate-mapping>" & vbCrLf & "" & vbCrLf & "'--SPRING:" & vbCrLf & "" & vbCrLf & "<object id=""ClasseQualquerDao"" type=""Fgv.NameSpaceQualquer.ClasseQualquerDao, Fgv.NameSpaceQualquer"" autowire=""byType"">" & vbCrLf & "  </object>" & vbCrLf & "" & vbCrLf & "'--TESTE:" & vbCrLf & "" & vbCrLf & "<TestMethod()> _" & vbCrLf & "Public Sub SalvarClasseQualquer()" & vbCrLf & "" & vbCrLf & "Dim _ClasseQualquer As ClasseQualquer" & vbCrLf & "    _ClasseQualquer = New ClasseQualquer" & vbCrLf & "" & vbCrLf & "    _ClasseQualquer.Salvar()" & vbCrLf & "" & vbCrLf & "" & vbCrLf & "    Assert.IsTrue(_ClasseQualquer.Id.HasValue)" & vbCrLf & "" & vbCrLf & "End Sub" & vbCrLf & ""
    End Function

    Public Function ExtraiNomeArquivo(ByVal _conteudo As String) As String

        Dim _linhas As String()

        _linhas = _conteudo.Split(vbCrLf)

        For Each _linha In _linhas
            If _linha.Contains("Public Class ") Then
                Return _linha.Replace("Public Class ", "").Trim & ".vb"
            End If
        Next


        For Each _linha In _linhas
            If _linha.Contains("Public Interface ") Then
                Return _linha.Replace("Public Interface ", "").Trim & ".vb"
            End If
        Next


        For Each _linha In _linhas
            If _linha.Contains("<class name=""") Then
                Dim _caracteres As Char()
                _linha = _linha.Replace("<class name=""", "")
                _caracteres = _linha.ToArray
                _linha = String.Empty
                For Each _caracter In _caracteres
                    If _caracter <> """" Then
                        _linha &= _caracter
                    Else
                        Exit For
                    End If
                Next
                Return _linha.Trim & ".hbm.xml"
            End If
        Next

        Return "NAO_EXTRAIU NOME " & Now.Year & Now.Month & Now.Day & Now.Hour & Now.Minute & Now.Second

    End Function

    Protected Sub InjetaCodigo(ByVal _conteudo As String, ByVal _destino As Destino)

        If _destino.Tipo = TipoDestino.BaseDominio Then
            Me.InjetaNoPontoExato(_destino, _conteudo, TipoContagem.FimParaInicio, "End Class", "#End Region")
        End If

        If _destino.Tipo = TipoDestino.Repositorio Then
            Me.InjetaNoPontoExato(_destino, _conteudo, TipoContagem.FimParaInicio, "End Class", "#End Region")
        End If

        If _destino.Tipo = TipoDestino.IRepositorio Then
            Me.InjetaNoPontoExato(_destino, _conteudo, TipoContagem.FimParaInicio, "End Interface")
        End If

        If _destino.Tipo = TipoDestino.Spring Then
            Me.InjetaNoPontoExato(_destino, _conteudo, TipoContagem.FimParaInicio, "</objects>")
        End If

        'BaseDominio FimParaInicio End Class, #End Region
        'Repositorio FimParaInicio End Class, #End Region
        'IRepositorio FimParaInicio End Interface

        'InicioParaFim 

    End Sub

    Protected Sub InjetaNoPontoExato(ByVal _pathArquivo As String, ByVal _conteudo As String, ByVal _tipoContagem As TipoContagem, ByVal ParamArray _itens() As String)

        Dim _arquivoFullPath As String = _pathArquivo
        Dim _linhas() As String
        Dim j As Integer = 0
        Dim _maximo As Integer = _itens.Count()

        If Not IO.File.Exists(_pathArquivo) Then
            Throw New Exception("Arquivo : " & _arquivoFullPath & " não existe.")
        End If

        _linhas = System.IO.File.ReadAllLines(_arquivoFullPath)

        If _tipoContagem = TipoContagem.FimParaInicio Then
            For i = (_linhas.Count - 1) To 0 Step -1
                Dim _linha As String
                _linha = _linhas(i)
                If _linha.Contains(_itens(j)) Then
                    If j < _maximo Then j += 1
                End If

                If j = _maximo Then
                    _linhas(i) = String.Format("{0}{1}{2}{3}", "", _conteudo, vbCrLf, _linha)
                    Exit For
                End If
            Next

            System.IO.File.WriteAllLines(_arquivoFullPath, _linhas)
        End If

        If _tipoContagem = TipoContagem.InicioParaFim Then
            Throw New NotImplementedException
        End If

    End Sub

    Protected Sub InjetaNoPontoExato(ByVal _destino As Destino, ByVal _conteudo As String, ByVal _tipoContagem As TipoContagem, ByVal ParamArray _itens() As String)

        Dim _arquivoFullPath As String = _destino.DiretorioDestino
        Dim _linhas() As String
        Dim j As Integer = 0
        Dim _maximo As Integer = _itens.Count()

        _linhas = System.IO.File.ReadAllLines(_arquivoFullPath)

        If _tipoContagem = TipoContagem.FimParaInicio Then
            For i = (_linhas.Count - 1) To 0 Step -1
                Dim _linha As String
                _linha = _linhas(i)
                If _linha.Contains(_itens(j)) Then
                    If j < _maximo Then j += 1
                End If

                If j = _maximo Then
                    '_linha = String.Format("{0}{1}{2}{3}", "", _conteudo, vbCrLf, _linha) '&= vbCrLf & _conteudo & vbCrLf & _linha
                    '_linhas(i) = _linha
                    _linhas(i) = String.Format("{0}{1}{2}{3}", "", _conteudo, vbCrLf, _linha) '&= vbCrLf & _conteudo & vbCrLf & _linha
                    Exit For
                End If
            Next

            System.IO.File.WriteAllLines(_arquivoFullPath, _linhas)
        End If

        If _tipoContagem = TipoContagem.InicioParaFim Then
            Throw New NotImplementedException
        End If

    End Sub

End Class


Public Enum TipoContagem
    FimParaInicio
    InicioParaFim
End Enum




